<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>单例模式</title>
  </head>
  <body>
    <!-- 
      JS设计模式-单例模式
      特点：
      1. 限制类只能有一个实例化对象，如果已经存在，则不创建实例
      2. 可以全局访问
      3. 执行很多次，保持唯一性

      优点：
      适用于单一对象，只生成一个对象实例
      避免频繁创建和销毁实例，减少内存占用。

      缺点：不适用动态扩展对象，或需创建多个相似对象的场景。
     -->

    <script>
      // ***************************  立即执行函数的单例模式   ******************************************************
      /*  
      // 立即执行函数
      const Person = (function () {
        function Person(name, age) {
          this.name = name;
          this.age = age;
        }
        let instance = null;
        // 立即执行返回的是函数
        return (...rest) => {
          // 当 instance 不存在的时候
          if (!instance) {
            // 重新创建
            instance = new Person(...rest);
          }
          // 如果存在返回原来的 instance
          return instance;
        };
      })();

       const p1 = Person("小高", 10);
       const p2 = Person("小张", 12);
       console.log(p1);
       console.log(p2);
      */

      // ***********************************************************************8

      function Person(name, sge) {
        // this.name = name;
        // this.age = name;
        // 如果 instance 不存在
        if (!Person.instance) {
          this.name = name;
          this.age = name;
          // 创建一个 instance
          Person.instance = this;
        }
        // 返回首次的 this
        return Person.instance;
      }
      const p1 = new Person("小高", 10);
      const p2 = new Person("小张", 12);
      console.log(p1);
      console.log(p2);
    </script>
  </body>
</html>
